package com.example.midprojcampusspringboot.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.midprojcampusspringboot.common.RandomUtil;
import com.example.midprojcampusspringboot.config.jwt.JwtUtil;
import com.example.midprojcampusspringboot.domain.entity.User;
import com.example.midprojcampusspringboot.domain.vo.UserQueryVo;
import com.example.midprojcampusspringboot.mapper.UserMapper;
import com.example.midprojcampusspringboot.service.UserService;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 3.用户查询：按照名字或id查询。
     *
     **/
    @Override
    public List<UserQueryVo> getUserByIdOrLoginName(Long id, String loginName) {
        return userMapper.selectUsersByIdOrLoginName(id, loginName);
    }

    @Override
    public void register(User user) {
        // 8个字符的随机字符串，作为加密的随机盐
        String salt = RandomUtil.generateStr(8);
        // 需要保存到数据库，第一次登录（认证）比较时需要使用
        user.setSalt(salt);

        // Md5Hash默认将随机盐拼接到源字符串的前面，然后使用md5加密，再经过x次的哈希散列
        // 第三个参数（hashIterations）：哈希散列的次数
        Md5Hash md5Hash = new Md5Hash(user.getPassword(), user.getSalt(), 1024);
        user.setPassword(md5Hash.toHex());

        // 保存
        userMapper.save(user);
    }

    @Override
    public String generateJwt(String username) {
        // 8个字符的随机字符串，作为生成jwt的随机盐
        // 保证每次登录成功返回的Token都不一样
        String jwtSecret = RandomUtil.generateStr(8);
        // 将此次登录成功的jwt secret存到数据库，下次携带jwt时解密需要使用
        userMapper.updateJwtSecretByUsername(username, jwtSecret);
        return JwtUtil.generateJwt(username, jwtSecret);
    }

    @Override
    public User findByUsername(String username) {
        return userMapper.findByUsername(username);
    }

//    @Override
//    public void logout(String username) {
//        // 将jwt secret置为空
//        userMapper.updateJwtSecretByUsername(username, "");
//    }

}
